/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package unmsm.fisi.tesis.servicio;

import java.util.List;

import unmsm.fisi.tesis.dao.ConfiguracionDAO;
import unmsm.fisi.tesis.entidad.Configuracion;
import unmsm.fisi.tesis.entidad.Cromosoma;
import unmsm.fisi.tesis.entidad.Paciente;
import unmsm.fisi.tesis.si.AlgoritmoGenetico;

/**
 * 
 * @author Jhon
 */
public class ProcesoPrincipal extends Thread{

	PacienteServicio pacienteServicio;
	Configuracion configuracion;
	AlgoritmoGenetico algoritmoGenetico;
	//Cromosoma cromosomaFinal;
	private StringBuilder seguimientoProceso;
	int Resultado[][];

	public int[][] getResultado() {
		return Resultado;
	}

	public void setResultado(int[][] resultado) {
		Resultado = resultado;
	}
	public void run() {
		
		
		synchronized(this){

		String codigoOrganizaciones = "1,2,3,4,5,6,7";
		String numReglasConsiderar = configuracion.getReglasToUsarOrganizacion()[0] + ","
									+ configuracion.getReglasToUsarOrganizacion()[1] + ","
									+ configuracion.getReglasToUsarOrganizacion()[2] + ","
									+ configuracion.getReglasToUsarOrganizacion()[3] + ","
									+ configuracion.getReglasToUsarOrganizacion()[4] + ","
									+ configuracion.getReglasToUsarOrganizacion()[5] + ","
									+ configuracion.getReglasToUsarOrganizacion()[6];
		
		ConfiguracionDAO.guardarValoresConfiguracion(configuracion, codigoOrganizaciones, numReglasConsiderar);
		
		algoritmoGenetico = new AlgoritmoGenetico();

		algoritmoGenetico.ejecutar(configuracion);

		this.setSeguimientoProceso(algoritmoGenetico.getSeguimiento());
		this.getSeguimientoProceso().append("<br><br><br>");

		for (int i = 0; i < algoritmoGenetico.getSeleccion().getFitnnesMayores().size(); i++) {
			this.getSeguimientoProceso().append(" [ ");
			System.out.println(" [ ");
			this.getSeguimientoProceso().append(
					algoritmoGenetico.getSeleccion().getFitnnesMayores().elementAt(i).toString());
			System.out.println(algoritmoGenetico.getSeleccion().getFitnnesMayores().elementAt(i).toString());
			this.getSeguimientoProceso().append(" ] - ");
			System.out.println(" ] - ");
		}

		this.setResultado(algoritmoGenetico.getSeleccion().getResultado());

		 notify();
		 
		}

	}

	public void cargarConfiguracion(int numeroPacientes, int numeroPoblacion,
			double probabilidadCrossover_x, double probabilidadMutacion_y,
			int[] reglasToUsarOrganizacion,int numeroGeneraciones, int datoParada, String condParada,
			int numHallazgos, String metodo,String selectedMetodoSeleccion,
			String selectedOperadorCroosover,String selectedOperadorMutacion) {

		configuracion = new Configuracion(numeroPacientes, numeroPoblacion,
				probabilidadCrossover_x, probabilidadMutacion_y,
				reglasToUsarOrganizacion, numeroGeneraciones,  datoParada, condParada, numHallazgos, metodo,
				selectedMetodoSeleccion, selectedOperadorCroosover, selectedOperadorMutacion);
		
	}

	public PacienteServicio getPacienteServicio() {
		return pacienteServicio;
	}

	public void setPacienteServicio(PacienteServicio pacienteServicio) {
		this.pacienteServicio = pacienteServicio;
	}

	public Configuracion getConfiguracion() {
		return configuracion;
	}

	public void setConfiguracion(Configuracion configuracion) {
		this.configuracion = configuracion;
	}

	public AlgoritmoGenetico getAlgoritmoGenetico() {
		return algoritmoGenetico;
	}

	public void setAlgoritmoGenetico(AlgoritmoGenetico algoritmoGenetico) {
		this.algoritmoGenetico = algoritmoGenetico;
	}

	public StringBuilder getSeguimientoProceso() {
		return seguimientoProceso;
	}

	public void setSeguimientoProceso(StringBuilder seguimientoProceso) {
		this.seguimientoProceso = seguimientoProceso;
	}

}
